package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.entity.SysFileLink;
import com.augurit.common.util.lang.CollectionUtils;
import com.augurit.common.util.lang.StringUtils;

/**
 * 附件与业务关联表DAO类
 */
@Repository
public class SysFileLinkDao extends BaseDao<SysFileLink, Long> {

	/**
	 * 根据附件表主键ID唯一获取关联表对象
	 * @param sysFileId 附件表主键ID
	 * @return
	 */
	public SysFileLink getBySysFileId(Long sysFileId){
		if(sysFileId != null)
			return this.findUniqueBy("sysFileId", sysFileId);
		else
			return null;
	}
	
	/**
	 * 按值对象名称分组查询
	 * @return
	 */
	public List<SysFileLink> getGroupByEntity(){
		String hql = "select count(ps) from SysFileLink ps group by ps.entity";
		List list = this.find(hql);
		return this.find(hql);
	}
	
	/**
	 * 获取指定值对象名称和值对象主键下的附件对象列表
	 * @param entity 值对象
	 * @param entityId 值主键
	 * @return
	 */
	public Long[] getSysFileIds(String entity, Long entityId){
		if(entity != null && entityId != null){
			String hql = "select ps.sysFileId from SysFileLink ps where ps.entity=? and ps.entityId=?";
			List values = new ArrayList();
			values.add(entity);
			values.add(entityId);
			List<Long> list = this.find(hql,values);
			return CollectionUtils.toLongArray(list);
		}
		return null;
	}
	
	/**
	 * 根据值对象名称获取关联表对象列表
	 * @param entity 值对象名称
	 * @return 
	 */
	public List<Long> getEntityId(String entity){
		if( entity != null){
			String hql = "select distinct(ps.entityId) from SysFileLink ps where ps.entity = ?";
			List values = new ArrayList();
			values.add(entity);
			return this.find(hql, entity);
		}
		return null;
	}
	

	public List<String> getAllEntity(){
		String hql = "select distinct(ps.entity) from SysFileLink ps ";
		return this.find(hql);
	}
	
	/**
	 * 新建关联对象
	 * @param entityName 值对象名称
	 * @param entityId 值对象ID
	 * @param sysFileId 附件记录ID
	 * @param memo 备注
	 */
	public SysFileLink add(String entityName, Long entityId, Long sysFileId, String memo){
		if(sysFileId != null && StringUtils.isNotBlank(entityName) && entityId != null){
			SysFileLink entity = new SysFileLink();
			entity.setEntity(entityName);
			entity.setEntityId(entityId);
			entity.setSysFileId(sysFileId);
			entity.setMemo(memo);
			this.save(entity);
			return entity;
		}else
			return null;
	}
	
	/**
	 * 更新附件记录的关联表的值对象名称和值对象ID
	 * @param sysFileId 附件记录ID
	 * @param newEntity 新的值对象名称
	 * @param newEntityId 新的值对象ID
	 */
	public void updateEntityInfo(Long sysFileId, String newEntity, Long newEntityId){
		
		//唯一获取关联表对象
		SysFileLink entity = getBySysFileId(sysFileId);
		
		//如果不一致则更新新值
		if(entity != null 
				&& (!entity.getEntity().equals(newEntity) 
						|| entity.getEntityId().compareTo(newEntityId) != 0)){
			entity.setEntity(newEntity);
			entity.setEntityId(newEntityId);
			this.save(entity);
		}
	}
}
